﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using ClasesLibreria.dominio;

namespace ClasesLibreria.dao
{
    public static class DAOFactura
    {
        public static void insertarFactura(Factura factura, string connectionString)
        {
            SqlConnection conn;
            SqlCommand cmd;
            SqlTransaction tra;

            conn = new SqlConnection();

            conn.ConnectionString = connectionString;
            conn.Open();

            tra = conn.BeginTransaction();

            cmd = new SqlCommand("INSERT INTO FacturaCliente   " +
                                 "  (IdUsuario,                " +
                                 "   IdBarrio,                 " +
                                 "   Fecha,                    " +
                                 "   Monto,                    " +
                                 "   Descuento,                " +
                                 "   NombreCliente,            " +
                                 "   ApellidoCliente,          " +
                                 "   Calle,                    " +
                                 "   Numero)                   " +
                                 "values                       " +
                                 "  (@IdUsuario,               " +
                                 "   @IdBarrio,                " +
                                 "   @Fecha,                   " +
                                 "   @Monto,                   " +
                                 "   @Descuento,               " +
                                 "   @NombreCliente,           " +
                                 "   @ApellidoCliente,         " +
                                 "   @Calle,                   " +
                                 "   @Numero);");
            cmd.Connection = conn;
            cmd.Transaction = tra;

            cmd.Parameters.Add(new SqlParameter("@IdUsuario", factura.UsuarioAlta.IdUsuario));
            cmd.Parameters.Add(new SqlParameter("@IdBarrio", factura.Barrio.Id));
            cmd.Parameters.Add(new SqlParameter("@Fecha", factura.FechaAlta));
            cmd.Parameters.Add(new SqlParameter("@Monto", factura.Monto));
            cmd.Parameters.Add(new SqlParameter("@Descuento", factura.Descuento));
            cmd.Parameters.Add(new SqlParameter("@NombreCliente", factura.NombreCliente));
            cmd.Parameters.Add(new SqlParameter("@ApellidoCliente", factura.ApellidoCliente));
            cmd.Parameters.Add(new SqlParameter("@Calle", factura.Calle));
            cmd.Parameters.Add(new SqlParameter("@Numero", factura.CalleNumero));

            int RegistrosAfectados = cmd.ExecuteNonQuery();


            cmd = new SqlCommand("SELECT @@Identity");
            cmd.Connection = conn;
            cmd.Transaction = tra;

            int idFactura = int.Parse(cmd.ExecuteScalar().ToString());

            foreach (FacturaItem itm in factura.ListaItems)
            {
                cmd = new SqlCommand(
" INSERT INTO FacturaClienteDetalle " +
"  (CodigoProducto,                 " +
"   NroFacturaCliente,              " +
"   Cantidad,                       " +
"   PrecioUnitario)                 " +
" VALUES                            " +
"  (@CodigoProducto,                " +
"   @NroFacturaCliente,             " +
"   @Cantidad,                      " +
"   @PrecioUnitario);               "
);
                cmd.Connection = conn;
                cmd.Transaction = tra;

                cmd.Parameters.Add(new SqlParameter("@CodigoProducto", itm.Producto.Codigo));
                cmd.Parameters.Add(new SqlParameter("@NroFacturaCliente", idFactura));
                cmd.Parameters.Add(new SqlParameter("@Cantidad", itm.Cantidad));
                cmd.Parameters.Add(new SqlParameter("@PrecioUnitario", itm.PrecioUnitario));

                RegistrosAfectados = cmd.ExecuteNonQuery();

                cmd = new SqlCommand("UPDATE Producto " +
                "                        SET StockActual = StockActual - @CantidadComprada " +
                "                      WHERE CodigoProducto = @CodigoProducto");
                cmd.Connection = conn;
                cmd.Transaction = tra;
                cmd.Parameters.Add(new SqlParameter("@CantidadComprada", itm.Cantidad));
                cmd.Parameters.Add(new SqlParameter("@CodigoProducto", itm.Producto.Codigo));
                RegistrosAfectados = cmd.ExecuteNonQuery();

            }

            tra.Commit();
            conn.Close();

        }

        public static SqlDataReader queryFacturas(string connectionString, string filtroFechaAlta, string stringOrderBy)
        {
            SqlConnection conn;
            SqlCommand cmd;
            SqlDataReader dr;
            string sqlText = "SELECT fc.NroFacturaCliente, fc.Fecha, fc.ApellidoCliente, fc.NombreCliente, " +
                " fc.Calle, fc.Numero CalleNumero, ba.idBarrio, ba.NombreBarrio, fc.Monto, fc.Concepto, fc.Descuento, fc.FechaAnulacion " +
                " FROM FacturaCliente fc, barrio ba where fc.idBarrio = ba.idBarrio ";

            conn = new SqlConnection();
            conn.ConnectionString = connectionString;
            conn.Open();
            cmd = new SqlCommand();

            if (filtroFechaAlta != "")
            {
                sqlText += " AND cast(fc.Fecha As Date) = @Fecha";
                cmd.Parameters.Add(new SqlParameter("@Fecha", DateTime.Parse(filtroFechaAlta)));
            }

            if (stringOrderBy != null)
            {
                sqlText = sqlText + " ORDER BY " + stringOrderBy;
            }

            cmd.CommandText = sqlText;
            cmd.Connection = conn;
            dr = cmd.ExecuteReader();

            return dr;
        }

        public static SqlDataReader queryDetalles(int nroFactura, string connectionString)
        {
            SqlConnection conn;
            SqlCommand cmd;
            SqlDataReader dr;

            conn = new SqlConnection();
            conn.ConnectionString = connectionString;
            conn.Open();
            cmd = new SqlCommand("SELECT     FacturaCliente.NroFacturaCliente AS numeroFactura, FacturaClienteDetalle.CodigoProducto AS productoCodigo, Producto.Nombre AS productoNombre, " +
                "      MarcaProducto.NombreProducto AS marcaNombre, FacturaClienteDetalle.Cantidad AS cantidad,  " +
                 "     FacturaClienteDetalle.PrecioUnitario AS precioUnitario, " +
                  "    FacturaClienteDetalle.Cantidad * FacturaClienteDetalle.PrecioUnitario AS monto " +
" FROM         FacturaCliente," +
                      "FacturaClienteDetalle, " +
         "             Producto, " +
           "           MarcaProducto " +
" WHERE FacturaCliente.NroFacturaCliente =  @NroFacturaCliente AND FacturaCliente.NroFacturaCliente = FacturaClienteDetalle.NroFacturaCliente " +
            "AND FacturaClienteDetalle.CodigoProducto = Producto.CodigoProducto " +
            "AND Producto.idMarcaProducto = MarcaProducto.idMarcaProducto");
            cmd.Connection = conn;
            cmd.Parameters.Add(new SqlParameter("@NroFacturaCliente", nroFactura));
            dr = cmd.ExecuteReader();

            return dr;
        }

        public static Factura getFacturaById(int nroFactura, string connectionString)
        {
            SqlConnection conn;
            SqlCommand cmd;
            SqlDataReader dr;
            Factura fac;

            string sqlText = "SELECT fc.NroFacturaCliente, fc.Fecha, fc.ApellidoCliente, fc.NombreCliente, " +
                " fc.Calle, fc.Numero CalleNumero, ba.idBarrio, ba.NombreBarrio, fc.Monto, fc.Concepto, fc.Descuento, fc.FechaAnulacion " +
                " FROM FacturaCliente fc, barrio ba where fc.idBarrio = ba.idBarrio AND fc.NroFacturaCliente = @NroFacturaCliente";

            conn = new SqlConnection();
            conn.ConnectionString = connectionString;
            conn.Open();

            cmd = new SqlCommand(sqlText);
            cmd.Connection = conn;
            cmd.Parameters.Add(new SqlParameter("@NroFacturaCliente", nroFactura));

            dr = cmd.ExecuteReader();

            fac = new Factura();
            while (dr.Read())
            {
                fac.Numero = int.Parse(dr["NroFacturaCliente"].ToString());
                fac.ApellidoCliente = dr["ApellidoCliente"].ToString();
                fac.NombreCliente = dr["NombreCliente"].ToString();
                fac.Calle = dr["Calle"].ToString();
                fac.CalleNumero = int.Parse(dr["CalleNumero"].ToString());
                fac.FechaAlta = DateTime.Parse(dr["Fecha"].ToString());

                DateTime arg = new DateTime();
                if (DateTime.TryParse(dr["FechaAnulacion"].ToString(), out arg))
                {
                    fac.FechaAnulacion = arg;
                }


                Barrio bar = new Barrio();
                bar.Id = int.Parse(dr["idBarrio"].ToString());
                bar.Nombre = dr["NombreBarrio"].ToString();
                fac.Barrio = bar;
            }
            conn.Close();

            dr = queryDetalles(fac.Numero, connectionString);

            while (dr.Read())
            {
                FacturaItem itm = new FacturaItem();
                itm.Cantidad = int.Parse(dr["cantidad"].ToString());
                itm.PrecioUnitario = float.Parse(dr["precioUnitario"].ToString());

                Producto prd = new Producto();
                prd.Codigo = int.Parse(dr["productoCodigo"].ToString());
                prd.Nombre = dr["productoNombre"].ToString();
                itm.Producto = prd;

                fac.ListaItems.Add(itm);

            }
            return fac;
        }

        public static void actualizarFactura(Factura factura, string connectionString)
        {
            SqlConnection conn;
            SqlCommand cmd;
            SqlTransaction tra;

            conn = new SqlConnection();

            conn.ConnectionString = connectionString;
            conn.Open();

            tra = conn.BeginTransaction();

            cmd = new SqlCommand("UPDATE FacturaCliente   " +
                                 "   SET UsuarioAnulacion = @UsuarioAnulacion , " +
                                 "       ObservacionAnulacion = @ObservacionAnulacion ," +
                                 "       FechaAnulacion = @FechaAnulacion " +
                                 " WHERE NroFacturaCliente = @NroFacturaCliente");
            cmd.Connection = conn;
            cmd.Transaction = tra;

            cmd.Parameters.Add(new SqlParameter("@UsuarioAnulacion", factura.UsuarioAnulacion.IdUsuario));
            cmd.Parameters.Add(new SqlParameter("@ObservacionAnulacion", factura.ObervacionAnulacion));
            cmd.Parameters.Add(new SqlParameter("@FechaAnulacion", factura.FechaAnulacion));
            cmd.Parameters.Add(new SqlParameter("@NroFacturaCliente", factura.Numero));

            int RegistrosAfectados = cmd.ExecuteNonQuery();

            foreach (FacturaItem itm in factura.ListaItems)
            {
                cmd = new SqlCommand("UPDATE Producto " +
"                        SET StockActual = StockActual + @CantidadComprada " +
"                      WHERE CodigoProducto = @CodigoProducto");
                cmd.Connection = conn;
                cmd.Transaction = tra;
                cmd.Parameters.Add(new SqlParameter("@CantidadComprada", itm.Cantidad));
                cmd.Parameters.Add(new SqlParameter("@CodigoProducto", itm.Producto.Codigo));
                RegistrosAfectados = cmd.ExecuteNonQuery();
            }

            tra.Commit();
            conn.Close();
        }

        public static SqlDataReader queryFacturasFecha(string connectionString, string filtrofecha, string stringOrderBy)
        {



            SqlConnection conn;

            SqlCommand cmd = new SqlCommand();

            SqlDataReader dr;



            //string sql = "select top 10 D.CodigoProducto,P.Nombre,count(D.CodigoProducto) as CantidadVendida ";
            string sql = "select top 10 D.CodigoProducto,P.Nombre,SUM(D.Cantidad) as CantidadVendida ";

            sql += "from FacturaClienteDetalle D,FacturaCliente F, Producto P ";

            sql += "where D.NroFacturaCliente = F.NroFacturaCliente ";

            sql += "And   D.CodigoProducto = P.CodigoProducto ";

            if (filtrofecha != "")
            {
                cmd.Parameters.Add(new SqlParameter("@Fecha", DateTime.Parse(filtrofecha)));

           }

            sql += "and cast(F.Fecha as Date) = @Fecha ";

            sql += "group by D.CodigoProducto, Nombre ";

            //sql += "order by count(D.CodigoProducto)desc";
            sql += "order by SUM(D.Cantidad)desc";





            conn = new SqlConnection();

            conn.ConnectionString = connectionString;

            conn.Open();



            //if (stringOrderBy != null)

            //{

            //    sql = sql + " ORDER BY " + stringOrderBy;

            //}



            cmd.CommandText = sql;

            cmd.Connection = conn;

            dr = cmd.ExecuteReader();



            return dr;

        }
    }
}
